package com.qf.juc.day02;

/**
 * 验证 多线程之间 执行代码的 无序性
 *
 *     //声明四个变量
 *     static volatile int a,b;
 *     static volatile int x,y;
 *
 *     改成是有序性  ：
 *
 *     volatile:可以让多线程指令不要重排、线程之间的数据同步到主内存
 *
 */
public class VolatileOrderDemo {

    //声明四个变量
    static volatile int a,b;
    static volatile int x,y;

    public static void main(String[] args) throws InterruptedException {

        int i = 0;//  无限循环的时候 有一个计数器
        while (true){
            i++;
            a = b = x = y = 0;
            //开启 第一个线程
            Thread thread1 = new Thread(() -> {
                a = 1; // a=1
                x = b; // x=0  // x = 1 // x = 1
            }, "");
            //开启 第二个线程
            Thread thread2 = new Thread(() -> {
                b = 1; // b=1
                y = a;// y= 1  // y = 1 // y = 1
            }, "");

            thread1.start();
            thread2.start();

            thread1.join();
            thread2.join();

            System.out.println("第" + i + "次打印：x=" + x + ", y=" + y);

            if (x == 0 && y == 0){//可能性为0 不可能同时是0
                break;
            }
        }
    }
}